
// 导出一个axios的实例  而且这个实例要有请求拦截器 响应拦截器
import axios from 'axios'
/* 引入store */
import store from "@/store"
// 引入组件的一个组件
import { Message } from 'element-ui'
import router from '@/router'

// 引入时间戳
import { getTimeStamp } from '@/utils/auth'

// 规定超时的事件秒
const TimeOut = 3600 // 定义时间戳的超时时间
const service = axios.create({
  // 写入根路径这里使用的是.env.development里面的反向代理视为了解决跨域的问题同时也是开发环境的是用线路
  // 执行npm run dev执行的是开发1环境执行npm run build执行的是生产环境
  baseURL: process.env.VUE_APP_BASE_API,
  // timeout请求的时间限制
  timeout: 10000
})
// 创建一个axios的实例
/* 
// 请求拦截器
*/
service.interceptors.request.use(succeed => {
  // 如果store.getters.token里面的touken
  if (store.getters.token) {
    if(IsCheckTimeOut()){
          // 如果它为true表示 过期了
      // token没用了 因为超时了
      store.dispatch('user/logout') // 登出操作
      // 跳转到登录页
      router.push("/login")
      // 抛出错误
      return Promise.reject(new Error("时间到....."))
    }
    succeed.headers['Authorization'] = `Bearer ${store.getters.token}`

  } 
  return succeed
}, be_defeated => {
  return Promise.reject(be_defeated)
})
// 相应拦截器请求数据的成功与失败
service.interceptors.response.use(succeed => {
  // 创建一个变量解析参数将数据解析
  const { success, message, data } = succeed.data
  // 然后根据解析对象里面得到success判断是否获取成功
  if (success) {
    // 如果请求成功那么返回数据的值
    return data
  } else {
    //调用方法返回错误消息
    Message.error(message)
    return Promise.reject(new Error(message))
  }
}, be_defeated => {
  //判断错误码： error 有response对象 
  if(be_defeated.response&&be_defeated.response.data&&be_defeated.response.data.code === 10002){
// 如果10002判断为truename说明touken超时了name调用store里面的字节点下的user下的logout方法来进行跳转
// token过期跳出首页
store.dispatch("user/logout")
// 调用路由里面的登录也路径来进行跳转
router.push("/login")
  }
  Message.error(be_defeated.message)
  // 让当前执行链跳出成功执行直接进入catch
  return Promise.reject(be_defeated)
}) // 响应拦截器
/* 
创建一个时间戳的对比
*/
function IsCheckTimeOut(){
  // 当前的事件戳
  let formerly = Date.now()
  // touken注入的时间戳
  let  Now = getTimeStamp()
  return  (formerly - Now)/1000 > TimeOut
}
export default service // 导出axios实例